package ClassLoadTest;

/**
 * 局部变量和类变量、实例变量
 * @author: 叶子
 * @date: 2022/02/14 17:42
 **/
public class FieldTest {
    static int s;//类变量，值存储在方法区
    int i;//实例变量，值存储在堆中
    int j;//实例变量，值存储在堆中
    {//每次创建对象执行一次非静态代码块，不会改变成员变量i的值，所以obj1和obj2创建后，两个对象的实例变量i都是0
        int i = 1;
        i++;//此处i为局部变量，值存储在栈中
        j++;//所以创建obj1的时候，obj1.j=1,创建obj2的时候，obj2.j=1
        s++;//创建对象，s+1，初始值为0，obj1创建后s为1，obj2创建后，s为2
    }
    public void test(int j){
        j++;//此处为局部变量j，就近原则，改变的是局部变量j的值，最终要打印的是实例变量j的值，所以test方法不会改变j的值
        i++;//此处为成员变量i，每次调用test方法，i+1，所以obj1调用了两次，obj1.i=2,obj2调用了1次，obj2.i=1
        s++;//每次调用test方法s+1,所以3次调用过后，类变量s的值为+3，因为创建两次对象过后，类变量s为2，所以最后s=5
    }

    public static void main(String[] args) {
        FieldTest obj1 = new FieldTest();
        FieldTest obj2 = new FieldTest();
        obj1.test(10);
        obj1.test(20);
        obj2.test(30);
        System.out.println(obj1.i+","+obj1.j+","+obj1.s);//2,1,5
        System.out.println(obj2.i+","+obj2.j+","+obj2.s);//1,1,5
    }
}